【新機能】BigQuery data canvasを早速触ってみた #GoogleCloudNext
Google Cloudデータエンジニアのはんざわです。
現在開催中のGoogle Cloud Next'24でBigQuery data canvasという新機能が追加されました。
本記事では早速この新機能を触ってみたいと思います!
BigQuery data canvas とは?
BigQuery data canvasは、データソースの選択、クエリの実行、可視化をDAGで操作できる分析用のインターフェイスです。
また、Geminiのサポートにより、自然言語を使用したデータの検索やSQLの作成、グラフの生成も行うことが可能です。
- BigQuery data canvasの公式ドキュメント
それでは早速触ってみたいと思います!
注意
2024年4月10日時点でBigQuery data canvasはprivate プレビューで、使用するためにはRequest BigQuery data canvas accessのフォーム申請が必要になっています。
今すぐに触ってみたい方は上記フォームに従って、有効化の設定を進めてください。
以下の公式ブログによると4月15日からpublic プレビューとなり、全ユーザーに展開されるようです。
BigQuery data canvas is launching in preview and will be rolled out to all users starting on April 15th
サンプルデータで試してみる
この検証では、データセットを東京リージョンに移動させたBigQueryサンプルテーブルのgsod
を使用し、年毎の降水量を棒グラフで表示させてみたいと思います。
まずはBigQuery Studioのコンソールから下記のどちらかでデータキャンパスを作成
を選択します。
選択すると以下のような画面に移動し、最近使用したテーブルや保存したクエリ、最近のクエリを確認できます。
テーブルの検索ボックスにgsod
と入力し、対象のテーブルの右にあるADD TO CANVAS
を選択します。
公式ドキュメントによるとテーブルの検索はdataplexのメタデータと連携し、適切なテーブルを推薦するそうです。
積極的に活用するためには、メタデータの整備の重要性が上がってくると予想されます。
するとキャンパス上で通常のテーブル通りにテーブルの詳細や中身を確認することができます。
このテーブルにクエリを実行したいのでクエリ
を選択します。
選択するとクエリを実行できる画面が表示されます。
Geminiでクエリを生成することも可能ですし、自分でクエリを入力することも可能です。
せっかくなので今回はGeminiでクエリを生成してみたいと思います。
今回は年毎に降水量を算出したいのでshow yearly amount of precipitation
と入力し、右の矢印ボタンを選択します。
以下のようなクエリが生成されました。
SELECT gsod.year, SUM(gsod.total_precipitation) AS total_precipitation FROM `<PROJECT_ID>.samples_dataset.gsod` AS gsod GROUP BY 1
生成されたクエリとドライランの結果を確認し、問題ないようであれば赤枠の実行を選択します。
クエリが正常に成功しました。
次にデータを可視化したいので、下の可視化
から棒グラフの作成
を選択します。
すると以下のようなグラフとその考察が表示されます。
全体像は以下のようになっています。
サンプルテーブルを使用し、可視化することができました。
データを可視化するまでの過程が一目で把握できる点は優れていると感じました!
次はもう少し複雑なデータを作成し、可視化してみたいと思います。
少し複雑なテーブルで試してみる
この検証では複数のテーブルで結合が発生するケースを試してみたいと思います。
例として、商品テーブルと顧客注文テーブルと顧客情報テーブルの3つのテーブルが存在すると仮定します。
結合の方法として、先に顧客注文テーブルと商品テーブルを結合し、最後に顧客情報テーブルを結合します。
それでは早速試してみましょう!
前準備
まずは検証に使用するテーブルを作成します。(サンプルデータ作成の際には一部で生成AIを使用しました。)
テーブル名とカラムは以下のような想定です。
- 商品テーブル(
Products
)- ProductID: 商品ID
- ProductName: 商品名
- Price: 金額
- 顧客注文テーブル(
CustomerOrders
)- OrderDate: 注文日時
- CustomerID: 顧客ID
- ProductID: 商品ID
- 顧客情報テーブル(
CustomerInformation
)- CustomerID: 顧客ID
- Age: 年齢
- 商品テーブル
CREATE OR REPLACE TABLE sample_data_canvas.Products ( ProductID INT64, ProductName STRING, Price INT64 ); INSERT INTO sample_data_canvas.Products (ProductID, ProductName, Price) VALUES (1, 'スマートフォン', 50000), (2, 'ノートパソコン', 80000), (3, 'テレビ', 70000), (4, 'タブレット', 30000), (5, 'デジタルカメラ', 40000);
- 顧客注文テーブル
CREATE OR REPLACE TABLE sample_data_canvas.CustomerOrders ( OrderDate DATE, CustomerID INT64, ProductID INT64, ); INSERT INTO sample_data_canvas.CustomerOrders (OrderDate, CustomerID, ProductID) SELECT DATE '2024-04-10' AS OrderDate, CAST(FLOOR(RAND() * 10) + 1 AS INT64) AS CustomerID, CAST(FLOOR(RAND() * 5) + 1 AS INT64) AS ProductID FROM UNNEST(GENERATE_ARRAY(1, 100));
- 顧客情報テーブル
CREATE TABLE sample_data_canvas.CustomerInformation ( CustomerID INT64, Age INT64 ); INSERT INTO sample_data_canvas.CustomerInformation (CustomerID, Age) SELECT CAST(customer_id AS INT64) AS CustomerID, CAST(FLOOR(RAND() * 50) + 20 AS INT64) AS Age FROM UNNEST(GENERATE_ARRAY(1, 10)) AS customer_id;
試してみる
冒頭で説明した通り、まずは顧客注文テーブル(CustomerOrders
)と商品テーブル(Products
)を結合します。
まずは先程と同じようにCustomerOrders
のテーブルを検索し、キャンパスに追加しました。
続けて、結合するテーブルも追加します。
右下の+
からNew search
を選択します。
同様にProducts
のテーブルを検索し、キャンパスに追加しました。
追加したらJOIN
を選択し、右テーブルの名前を選択します。
クエリを実行する画面に移動するので以下のクエリを入力し、実行しました。
SELECT t1.CustomerID, t1.OrderDate, t2.ProductID, t2.ProductName FROM sample_data_canvas.CustomerOrders AS t1 LEFT JOIN sample_data_canvas.Products AS t2 ON t1.ProductID = t2.ProductID
結合できました!
結合されたテーブルは線が引かれていて、一目で把握できるようになっていました。
続けて、CustomerInformation
のテーブルをキャンパスに追加し、結合します。
現時点での全体像は以下の通りです。
事前に結合した左のテーブルとCustomerInformation
のテーブルを結合したかったのですが、左のテーブルのデータセット名とテーブル名を取得するのが困難(現時点ではデバック情報から探すしかなさそう?)でしたのでGeminiでクエリを生成し、結合させます。(おそらく今後のアップデートで改善されると予想されます。)
2つのテーブルをCustomerID
のカラムをキーに結合させたいのでPlace the CustomerInformation table to the right and join the tables using CustomerID as the key
と入力し、クエリを生成しました。
生成されたクエリは以下の通りです。
前回と同様に問題ないことを確認した上で実行しました。
SELECT t1.CustomerID, t1.OrderDate, t1.ProductID, t1.ProductName, t2.Age FROM `<PROJECT_ID>._197dd1fcd7aad6e1234a7933d678881672ab3991.anon605b65055b201ae26d9865f478a9503ea160e8c8fa1f2c1bb4fcabbee4c53d46` AS t1 LEFT JOIN `<PROJECT_ID>.sample_data_canvas.CustomerInformation` AS t2 ON t1.CustomerID = t2.CustomerID
最終的に以下のようなテーブルが完成しました。
せっかくなので最後に商品毎の売上個数を円グラフで作成しました。
最終的なDAGは以下のようになりました。
やはり一目で全体の構成を把握できるのは便利だなと思いました。
仮にですが、この一連の流れを1つのクエリで表すと以下のようになります。
SELECT CP.CustomerID, CP.OrderDate, CP.ProductID, CP.ProductName, CI.Age FROM ( SELECT C.CustomerID, C.OrderDate, P.ProductID, P.ProductName FROM sample_data_canvas.CustomerOrders AS C LEFT JOIN sample_data_canvas.Products AS P ON C.ProductID = P.ProductID ) AS CP LEFT JOIN sample_data_canvas.CustomerInformation AS CI ON CP.CustomerID = CI.CustomerID
普段SQLを書いている人であれば問題ないと思いますが、テーブルが増えれば増えるほど全体の構成を把握するのが困難になります。
また、サブクエリや一時テーブルを活用し、クエリの可読性を高めることも可能ですが、同様にテーブルの数が増えれば困難になると思います。
全体の感想
この記事では、BigQuery data canvasを実際に触ってみました。
何度も言っていますが、全体の構成を容易に把握できるのは便利だなと思いました。
また、このサービスが今後どのユーザー向けにアップデートされていくのか非常に楽しみです。
データエンジニア向けにアップデートされていくのであれば、スケジュール機能やDAGをSQLで管理する構文などを追加してもらいたいなと思いました。
一方で以下のブログでは、データアナリスト向けの活用例などが紹介されているので是非参考にしてみてください!
今後のアップデートにも期待です!
また、Next'24の翌週に帰国したばかりの現地参加メンバーが振り返り勉強会を行いますので是非とも現地でご参加ください!